/**
 * File: ProdutoMB.java
 * Data: 05.01.2011
 * Objective: Criar a classe managed bean da entidade que representa o Produto.
 *
 * Copyright 2011 S2DZ CORPORATION
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package mbeans;

import controller.ProdutoController;
import controller.StockController;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import modelo.ProdutoModelo;
import modelo.StockModelo;
import controller.ControllerUtil;
import controller.ModeloProdutoController;
import controller.TipoProdutoController;
import java.util.ArrayList;
import java.util.Collection;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import org.richfaces.component.UIExtendedDataTable;

/**
 * Managed Bean da entidade que representa o Produto.
 * @author Paulo Ilenga
 */
@ManagedBean
@ViewScoped
public class ProdutoMB implements Serializable
{

    private final String NOME_TABELA = "tbl_produto";
    private final String NOME_ENTIDADE = "PRODUTO";
    private ProdutoController controller;
    private ModeloProdutoController modeloProdutoController;
    private TipoProdutoController tipoProdutoController;
    private ProdutoModelo modelo, modeloTemp;
    private List<ProdutoModelo> seleccionados = new ArrayList<ProdutoModelo>();
    private Collection<Object> selection;
    private FacesContext context;
    private StockModelo stockModelo;
    private StockController stockController;
    private ModeloProdutoMB modeloProdutoMB;
    private TipoProdutoMB tipoProdutoMB;

    /** Constructor da classe sem argumentos */
    public ProdutoMB()
    {
        controller = new ProdutoController();
        stockController = new StockController();
        modeloProdutoController = new ModeloProdutoController();
        tipoProdutoController = new TipoProdutoController();
        modeloProdutoMB = new ModeloProdutoMB();
        tipoProdutoMB = new TipoProdutoMB();
        modelo = new ProdutoModelo();
        modeloTemp = new ProdutoModelo(0, 0, 1, 0, "NÃO FOI SELECCIONADO NEM UM REGISTO!", "NÃO FOI SELECCIONADO NEM UM REGISTO!", "NÃO FOI SELECCIONADO NEM UM REGISTO!", "NÃO FOI SELECCIONADO NEM UM REGISTO!", new Date(), "NÃO FOI SELECCIONADO NEM UM REGISTO!");
    }

//------------------------inicio dos Métodos set e get---------------------------------
    public ProdutoController getController()
    {
        return controller;
    }

    public void setController(ProdutoController controller)
    {
        this.controller = controller;
    }

    public ProdutoModelo getModelo()
    {
        modelo.setDataRegisto(new Date());
        return modelo;
    }

    public void setModelo(ProdutoModelo modelo)
    {
        this.modelo = modelo;
    }

    public ProdutoModelo getModeloTemp()
    {
        return modeloTemp;
    }

    public void setModeloTemp(ProdutoModelo modeloTemp)
    {
        this.modeloTemp = modeloTemp;
    }

    public List<ProdutoModelo> getTodosTable()
    {
        return controller.getTodos(false);
    }

    public List<ProdutoModelo> getTodosCombo()
    {
        return controller.getTodos(true);
    }

    public List<ProdutoModelo> getTodosComLigacao()
    {
        return controller.getTodosComLigacao();
    }

    public List<ProdutoModelo> getSeleccionados()
    {
        return seleccionados;
    }

    public void setSeleccionados(List<ProdutoModelo> seleccionados)
    {
        this.seleccionados = seleccionados;

    }

    public Collection<Object> getSelection()
    {
        return selection;
    }

    public void setSelection(Collection<Object> selection)
    {
        this.selection = selection;
    }

    public ModeloProdutoMB getModeloProdutoMB()
    {
        return modeloProdutoMB;
    }

    public void setModeloProdutoMB(ModeloProdutoMB modeloProdutoMB)
    {
        this.modeloProdutoMB = modeloProdutoMB;
    }

    public TipoProdutoMB getTipoProdutoMB()
    {
        return tipoProdutoMB;
    }

    public void setTipoProdutoMB(TipoProdutoMB tipoProdutoMB)
    {
        this.tipoProdutoMB = tipoProdutoMB;
    }

    //-----------------------fim dos métodos set e get------------------------------
    public void selectionListener(AjaxBehaviorEvent event)
    {
        UIExtendedDataTable dataTable = (UIExtendedDataTable) event.getComponent();

        Object originalKey = dataTable.getRowKey();

        seleccionados.clear();

        for (Object selectionKey : selection)
        {
            dataTable.setRowKey(selectionKey);

            if (dataTable.isRowAvailable())
            {
                seleccionados.add((ProdutoModelo) dataTable.getRowData());
            }
        }

        if (!seleccionados.isEmpty())
        {
            //if (modeloTemp.getId() != seleccionados.get(0).getId())
            //{
            modeloTemp = seleccionados.get(0);
            modeloProdutoMB.getModelo().setIdMarca(modeloProdutoController.getById(modeloTemp.getIdModelo()).getIdMarca());
            tipoProdutoMB.getModelo().setIdCategoria(tipoProdutoController.getById(modeloTemp.getIdTipo()).getIdCategoria());
            //}
        }

        dataTable.setRowKey(originalKey);
    }

    /**
     * Método salvar da classe
     */
    public void salvar()
    {
        context = FacesContext.getCurrentInstance();

        if (!modelo.getDescricao().equals(""))
        {
            if (modelo.getIdModelo() != 0)
            {
                if (modelo.getIdTipo() != 0)
                {
                    if (modelo.getIdFabricante() != 0)
                    {
                        if (!modelo.getCor().equals(""))
                        {
                            if (!modelo.getTamanho().equals(""))
                            {
                                if (!modelo.getNumSerie().equals(""))
                                {
                                    if (!modelo.getEstocavel().equalsIgnoreCase("Seleccionar"))
                                    {
                                        if (controller.save(modelo))
                                        {
                                            if (modelo.getEstocavel().equalsIgnoreCase("sim"))
                                            {
                                                stockModelo = new StockModelo(0, ControllerUtil.getIdActual(NOME_TABELA), 5, 0, 0, 0);

                                                if (!stockController.save(stockModelo))
                                                {
                                                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO N.º SG001: AO REGISTAR NO STOCK! CONSULTE O SUPORTE"));
                                                }
                                            }
                                            modelo = new ProdutoModelo();
                                            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "", "REGISTO GUARDADO COM SUCESSO!"));
                                        } else
                                        {
                                            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO N.º SG001: AO GUARDAR O REGISTO! CONSULTE O SUPORTE"));
                                        }
                                    } else
                                    {
                                        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE INFORMAR SE O PRODUTO É ESTOCÁVEL!"));
                                    }

                                } else
                                {
                                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE DIGITAR O NÚMERO DE SÉRIE!"));
                                }
                            } else
                            {
                                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE DIGITAR O TAMANHO!"));
                            }
                        } else
                        {
                            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE DIGITAR A COR!"));
                        }
                    } else
                    {
                        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE SELECCIONAR O FABRICANTE!"));
                    }
                } else
                {
                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE SELECCIONAR A CATEGORIA E O TIPO"));
                }

            } else
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE SELECCIONAR O MODELO DO " + NOME_ENTIDADE + "!"));
            }
        } else
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE DIGITAR A DESCRIÇÃO DO " + NOME_ENTIDADE + "!"));
        }
    }

    /**
     * Método que actualiza os dados do registo.
     */
    public void actulizar()
    {
        context = FacesContext.getCurrentInstance();

        if (modeloTemp.getId() != 0)
        {
            if (!modeloTemp.getDescricao().equals(""))
            {
                if (modeloTemp.getIdModelo() != 0)
                {
                    if (modeloTemp.getIdTipo() != 0)
                    {
                        if (modeloTemp.getIdFabricante() != 0)
                        {
                            if (!modeloTemp.getCor().equals(""))
                            {
                                if (!modeloTemp.getTamanho().equals(""))
                                {
                                    if (!modeloTemp.getNumSerie().equals(""))
                                    {
                                        if (!modeloTemp.getEstocavel().equalsIgnoreCase("Seleccionar"))
                                        {
                                            if (controller.update(modeloTemp))
                                            {
                                                novoModelo();
                                                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "", "REGISTO ACTUALIZADO COM SUCESSO!"));
                                            } else
                                            {
                                                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO N.º SG001: AO ACTUALIZAR O REGISTO! CONSULTE O SUPORTE"));
                                            }
                                        } else
                                        {
                                            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE DIGITAR O PREÇO!"));
                                        }
                                    } else
                                    {
                                        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE DIGITAR O NÚMERO DE SÉRIE!"));
                                    }
                                } else
                                {
                                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE DIGITAR O TAMANHO!"));
                                }
                            } else
                            {
                                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE DIGITAR A COR!"));
                            }
                        } else
                        {
                            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE SELECCIONAR O FABRICANTE!"));
                        }
                    } else
                    {
                        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE SELECCIONAR A CATEGORIA E O TIPO"));
                    }

                } else
                {
                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE SELECCIONAR O MODELO DO " + NOME_ENTIDADE + "!"));
                }
            } else
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE DIGITAR A DESCRIÇÃO DO " + NOME_ENTIDADE + "!"));
            }
        } else
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO AVISO N.º UE001: DEVE SELECCIONAR PELO MENOS UM REGISTO."));
        }
    }

    /**
     * Método que elimina os dados do registo.
     */
    public void eliminar()
    {
        context = FacesContext.getCurrentInstance();

        if (!seleccionados.isEmpty())
        {
            List<ProdutoModelo> seleccionadosEliminar = new ArrayList<ProdutoModelo>(seleccionados);
            
            for (ProdutoModelo modeloEliminar : seleccionadosEliminar)
            {

                if (controller.eliminar(modeloEliminar.getId(), NOME_TABELA))
                {
                    novoModelo();

                } else
                {
                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO N.º SG001: AO ELIMINAR O(S) REGISTO(S)! CONSULTE O SUPORTE."));
                    break;
                }
            }
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "", seleccionados.size() + " REGISTO(S) ELIMINADO(S) COM SUCESSO!"));
        } else
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO AVISO N.º UE001: DEVE SELECCIONAR PELO MENOS UM REGISTO."));
        }

    }

    /**
     * Métodos que cria uma nova instância do objecto modelo.
     */
    public void novoModelo()
    {
        modeloTemp = new ProdutoModelo(0, 0, 1, 0, "NÃO FOI SELECCIONADO NEM UM REGISTO!", "NÃO FOI SELECCIONADO NEM UM REGISTO!", "NÃO FOI SELECCIONADO NEM UM REGISTO!", "NÃO FOI SELECCIONADO NEM UM REGISTO!", new Date(), "NÃO FOI SELECCIONADO NEM UM REGISTO!");
        modeloProdutoMB = new ModeloProdutoMB();
        tipoProdutoMB = new TipoProdutoMB();
        seleccionados.clear();
        selection.clear();
    }

    public boolean isItemSelected()
    {
        if (!seleccionados.isEmpty() & modeloTemp.getId() != 0)
        {
            return seleccionados.get(0) != null;
        } else
        {
            return false;
        }
    }

    public void validarSeleccao()
    {
        if (seleccionados.isEmpty())
        {
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE SELECCIONAR PELO MANOS UM REGISTO!"));
        }
    }
}
